package com.dycong.common.dataStructuresAndAlgorithms;

import org.junit.Test;

/**
 * Created by Duke on 2016/11/18.
 */
public class TestCircle {

    /**
     * @param args
     * @see break和continue。
     * @see 以上两种方法没有办法跳出多层循环,如果需要从多层循环跳出,则需要使用标签,定义一个标签label,然后再需要跳出的地方,用break label就行了
     * @see 当达到自己需要的处理效果当然就可以退出循环啦,携带数据可以通过修改外部变量,或者return myData
     */
    @Test
    public void testBreak() {
        loop:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    for (int h = 0; h < 10; h++) {
                        if (h == 6) {
                            break loop;
                        }
                        System.out.print(h);
                    }
                }
            }
        }
        System.out.println("\nI'm here!");
    }

    @Test
    public void testBreak2() {
        loop:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    // TODO: 2018/3/29 只会到这里 
                    for (int h = 0; h < 10; h++) {
                        if (h == 6) {
                            break;
                        }
                        System.out.print(h);
                    }
                }
            }
        }
        System.out.println("\nI'm here!");
    }

    @Test
    public void testContinue() {
        loop:
        // TODO: 2018/3/29 continue loop;回到这里了 
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    for (int h = 0; h < 10; h++) {
                        if (h == 6) {
                            continue loop;
                        }
                        System.out.print(h);
                    }
                }
            }
        }
        System.out.println("\nI'm here!");
    }

    @Test
    public void testContinue2() {
        loop:
        // TODO: 2018/3/29 continue loop;回到这里了
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (j == 6) {
                    continue loop;
                }
                System.out.print(j);
            }
            System.out.println();
        }
        System.out.println("\nI'm here!");
    }

    /**
     * @see 不会执行到后一个打印,return退出整个方法,而不是退出循环,但是退出方法肯定退出循环啦！！！
     * @see 得到需要的数据当然就可以return myData
     */
    public void testReturn() {
        loop:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 9; k++) {
                    for (int h = 0; h < 10; h++) {
                        if (h == 6) {
                            return;
                        }
                        System.out.print(h);
                    }
                }
            }
        }
        System.out.println("\nI'm here!");
    }
}

/**
 * todo 递归
 * todo 基准条件：符合基准条件不会再进入递归的逻辑，开始进入return;
 * todo 基本法则：
 * todo 1.基准情形,必须总要有某些基准情形,它无需递归就能解出---某些:意味着可以有不止一个基准情形---可以有多个递归终止条件
 * todo 2. 不断推进:对于那些需要递归求解的情形,每一次递归调用都必须要使求解状况朝接近基准情形的方向推进 —— 由初始情形通过递归调用不断向递归终止条件推进
 * todo 3.设计法则:假设所有的递归调用都能运行
 * todo 4. 合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作（三天内在斐波那契数列的实现中详细介绍这条法则并补充本文内容）
 */
